﻿using Kingdee.BOS.Core.List.PlugIn;
using Kingdee.BOS.Core.List.PlugIn.Args;
using Kingdee.BOS.Core.Metadata;
using Kingdee.BOS.Core.Metadata.EntityElement;
using Kingdee.BOS.Core.Metadata.QueryElement;
using Kingdee.BOS.Orm.DataEntity;
using Kingdee.BOS.Util;
using Kingdee.BOS.Web.Bill;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;

namespace LM.YF.K3Cloud.Plugin
{
    [Description("排除已选择的上游分录（单据转换上游单据的列表插件）"), HotUpdate]
    public class DrawDistinctBillListPlugin : AbstractListPlugIn
    {
        /// <summary>
        /// 重写 PrepareFilterParameter 方法，准备过滤参数
        /// </summary>
        /// <param name="e">过滤参数</param>
        public override void PrepareFilterParameter(FilterArgs e)
        {
            base.PrepareFilterParameter(e);

            // 检查是否存在父窗体视图，且父窗体视图是否为 BillView 类型
            if (View.ParentFormView == null || !(View.ParentFormView is BillView))
            {
                return;
            }

            // 将父窗体视图转换为 BillView 类型
            BillView downstreamBillView = View.ParentFormView as BillView;

            // 检查 BillView 的模型是否为空
            if (downstreamBillView.Model == null)
            {
                return;
            }

            // 获取下游单据的业务信息
            BusinessInfo downstreamBizInfo = downstreamBillView.Model.BusinessInfo;

            // 获取下游单据的链接表集合
            LinkTableSet downstreamLinkSet = downstreamBizInfo.GetForm().LinkSet;

            // 检查链接表集合中是否有链接实体
            if (downstreamLinkSet.LinkEntitys.Count == 0)
            {
                return;
            }

            // 获取下游单据的数据对象
            DynamicObject downstreamObject = downstreamBillView.Model.DataObject;

            // 获取第一个链接实体
            LinkEntity linkEnitty = downstreamLinkSet.LinkEntitys.First();

            // 获取下游单据的主分录实体
            Entity downstreamMainEntryEntity = downstreamBizInfo.GetEntity(linkEnitty.ParentEntityKey);

            // 获取主分录实体对应的数据集合
            DynamicObjectCollection entryDatas = downstreamObject[downstreamMainEntryEntity.DynamicProperty] as DynamicObjectCollection;

            // 用于存储源分录的 ID 列表
            List<long> sourceEntryIds = new List<long>();

            // 用于存储上游表的名称
            string upstreamTableName = string.Empty;

            // 遍历每个分录数据
            foreach (DynamicObject entryData in entryDatas)
            {
                // 获取链接数据集合
                DynamicObjectCollection linkDatas = entryData[linkEnitty.Key] as DynamicObjectCollection;

                // 如果链接数据集合不为空
                if (linkDatas.Count > 0)
                {
                    // 将链接数据中的 SID 添加到源分录 ID 列表中
                    sourceEntryIds.AddRange(linkDatas.Select(x => Convert.ToInt64(x["SID"])).ToList());

                    // 如果上游表的名称为空，则获取第一个链接数据中的 STableName
                    if (upstreamTableName == string.Empty)
                    {
                        upstreamTableName = Convert.ToString(linkDatas.First()["STableName"]);
                    }
                }
            }

            // 如果源分录 ID 列表不为空
            if (sourceEntryIds.Count > 0)
            {
                // 去重源分录 ID 列表
                sourceEntryIds = sourceEntryIds.Distinct().ToList();

                // 获取与上游表名匹配的查询字段
                SelectField field = View.BillBusinessInfo
                    .GetQueryInfo().SelectFields
                    .First(x => x.EntityTable.TableName == upstreamTableName);

                if (field != null)
                {
                    // 获取查询字段的别名
                    string entryTableNameAs = field.FullFieldName.Substring(0, field.FullFieldName.IndexOf('.'));

                    // 追加过滤条件，排除源分录 ID 列表中的分录
                    e.AppendQueryFilter($" {entryTableNameAs}.FENTRYID NOT IN ({string.Join(",", sourceEntryIds)}) ");
                }
            }
        }
    }
}
